<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>

</html>
<script>
    // Object.keys() 把对象中所有的属性名称拿出来组成一个新数组
    let obj = {
        a: 1,
        b: 2,
        c: 3
    }
    console.log(Object.keys(obj));
    /*
    Array(3)0: "a"1: "b"2: "c"length: 3__proto__: Array(0)
    */
    // Object.assign() 用来合并对象， 可以有多个值
    let obj2 = {
        m: 1,
        k: 2,
        i: 3
    }
    let obj3 = {
        q: 1,
        b: 2,
        z: 3
    }
    console.log(Object.assign(obj, obj2, obj3));
    /*
    Objecta: 1b: 2c: 3i: 3k: 2m: 1q: 1z: 3__proto__: Object
    会把后面的参数 的键值拿出来

    */
    //Object.is()  相当都  ===   全等
    // 这个方法 主要是修复 NaN === NaN = false  
    Object.is(NaN, NaN) //在这是全等的  为 false

    //重写 静态方法 keys()
    Object.keys = function (obj) {
        console.log(1);
        let arr = []
        for (const key in obj) {
            arr.push(key)
        }
        return "我是重写之后的方法" + arr;
    }
    console.log(Object.keys(obj));//重写 静态方法
    //重写 静态方法 assign()
    Object.assign = function (...arr) {
        var brr = [...arr]
        for (var i = 0; i < brr; i++) {
            for (const key in brr[i]) {
                brr[0][key] = brr[i][key]
            }
        }
        console.log("我是重新之后的方法");
        return brr[0]
    }
    console.log(Object.assign(obj, obj2));
    //重写 静态方法 is()
    Object.is = function (a, b) {
        if (a + "" === "NaN" && b + "" === "NaN") {
            console.log("我是重新之后的方法 判断 NaN");
            return true
        } else {
            console.log("我是重新之后的方法 判断 A和B");
            return a === b
        }
    }
    console.log(Object.is(NaN, NaN));

    // 数组方法
    //静态方法
    //forEach 方法 

    // Array.from() //转数组
    //重写 from 方法
    Array.from = function (arr) {
        if (typeof arr === "string") {
            arr = arr.split("")
        }
        return [...arr]
    }
    // Array.isArray() // 判断是数组还是对象
    Array.isArray = function (arr) {
        return arr[0] && typeof arr !== "string" ? true : false
    }

    //  实例方法
    //重写 fortEach 方法
    Array.prototype.forEach = function (fn) {
        for (var i = 0; i < this.length; i++) {
            fn(this[i], i, this)
        }
    }

    // arr.map() 方法
    Array.prototype.map = function (fn) {
        var arr = []
        for (var i = 0; i < this.length; i++) {
            arr.push(fn(this[0], i, this))
        }
    }
    //arr.find() arr.findIndexof()
    Array.prototype.find = function (fn) {

        for (var i = 0; i < this.length; i++) {
            if (fn(this[i], i, this)) {
                return this[i]
            } else {
                false
            }
        }
    }
    Array.prototype.findIndexof = function (fn) {

        for (var i = 0; i < this.length; i++) {
            if (fn(this[i], i, this)) {
                return i
            } else {
                return -1
            }
        }
    }
    //      let arr = [1,5,6]
    //    let a = arr.find((item,i,arr)=>{
    //         return item>3
    //      })


    //      let b = arr.findIndexof((item,i,arr)=>{
    //         return item>3
    //      })
    //      //arr.filter() 返回一个新数组
    //      let c= arr.filter((item,i,arr)=>{
    //         return item>3
    //      })
    Array.prototype.filter = function (fn) {
        var arr = []
        for (var i = 0; i < this.length; i++) {
            if (fn(this[i], i, this)) {
                arr.push(this[i])
            } else {

            }
        }
        return arr
    }
    //arr.every()
    Array.prototype.every = function (fn) {

        for (var i = 0; i < this.length; i++) {
            if (!(fn(this[i], i, this))) {
                return false
            }
        }
        return true
    }
    //arr.some()
    Array.prototype.some = function (fn) {

        for (var i = 0; i < this.length; i++) {
            if (fn(this[i], i, this)) {
                return true
            }
        }
        return false
    }
    //arr.reduce()
    Array.prototype.reduce = function (fn) {
        var a = null
        for (var i = 0; i < this.length-1; i++) {
          a += fn(this[i], this[i+1], i+1,this)
        }
        return a
    }
    var  arr = [1,2,3]
    var num = arr.reduce((a,b)=>{
        console.log(a+b);
            return a+b
        })
        console.log(num);
    //  console.log("123456".split(""));
</script>